/*
 * CommunicationRobot5.h
 *
 *  
 */

#ifndef COMMUNICATIONROBOT5_H_
#define COMMUNICATIONROBOT5_H_

#include "MiddlewareCommon.h"
#include "../IPC/SharedMemoryInterface.h"
#include "../IPC/MessageQueue.h"

namespace middleware {

class CommunicationRobot5 {
public:
	typedef enum{R5=0, AGV,ADP,ROBOT11}R5CommunicationType;
	CommunicationRobot5(std::string hostName, R5CommunicationType type);
	
	//Estado del 5
	PendientesRobot5 getListaPedidos();
	void setListaPedidos(PendientesRobot5 pendientes);
	EstadoRobot5 verEstado();
	void liberarPendientes();
	void despertar();
	void dormir();
	void despertarInteligente(); //solo lo despierta si esta dormido
	void incrementarPedidos(int index);
	void decrementarPedidos(int index);
	
	//R5-AGV
	void pedirCanastoAR5(PedidoCanasto pedido);
	void llevarCanastoAlAGV(int idAGV,Canasto canasto);
	Canasto recibirCanastoDel5(int idAGV);
	
	//R5-R11
	void enviarAvisoDeCintaAR5(PedidoCintas pedido);
	
	//R5-ADP
	void enviarAProducir(PedidoProduccion pedido);
	void pedirCanastoAlADP(Canasto c);
	Canasto getCanastoDeADP();

	//Colas de enventos
	PedidoCanasto getPedidoDeCanasto();
	PedidoCintas getPedidoDeCinta();
	PedidoProduccion getPedidoDeProd();
	
	//nada para hacer entonce se pone a dormir
	void noHacerNada();
	
	//launcher
	static void create(R5CommunicationType type,std::string hostName);
	static void destroy(R5CommunicationType type,std::string hostName);
	virtual ~CommunicationRobot5();

	static const std::string R5_SEM_PATH;
	static const std::string R5_SHMEM_PATH;

	static const char R5_SEM_KEY = 'a';
	static const char R5_SHMEM_ESTADO_KEY = 'a';
	static const char R5_SHMEM_PENDIENTES_KEY = 'b';

	static std::string getSemControlName();
	static std::string getSemRobot5FileWait();
	static std::string getSemRobot5FileSignal();
	static char getSemControlRobot5Key();

private:
	ipc::MessageQueue<PedidoCanasto> colaCanastos;
	ipc::MessageQueue<PedidoCintas> colaCintas;
	ipc::MessageQueue<PedidoProduccion> colaProduccion;
	ipc::MessageQueue<PedidoGabinetes> colaGabinetes;
	ipc::MessageQueue<Canasto> colaIntercambio;
	ipc::MessageQueue<Canasto> colaRecpcionCanastos;
	ipc::MessageQueue<PedidoCanasto> colaEnvioPedidosAlADP;
	ipc::SharedMemoryInterface<PendientesRobot5> shMemPendientes;
	ipc::SharedMemoryInterface<EstadoRobot5> shMemEstado;
	ipc::Semaphore semBloqueo;


	static const Uid UIDCanastos,UIDCintas,UIDProduccion,UIDGabinetes,UIDIntercambio,UIDRecepcionCanastos,UIDEnviosADP;

	int mtpyeRobot5Canastos;
	int mtpyeRobot5Cintas;
	int mtpyeRobot5Produccion;
	int mtpyeRobot5Gabinetes;
	int mtpyeRobot5EnviosADP;

	int mtypeRobot5IntercambioAGVIzq;
	int mtypeRobot5IntercambioAGVMed;
	int mtypeRobot5IntercambioAGVDer;

	static const int mtpyeRobot5RecepcionCanastos;
};

} /* namespace middleware */
#endif /* COMMUNICATIONROBOT5_H_ */
